package main

import (
	"log"
	"net"
	"net/rpc"
)

const (
	HelloServiceName = "com.zy.HelloService"
)

type HelloServiceInterface interface {
	Hello(request string, reply *string) error
}

// HelloService 类型
type HelloService struct {
}

// Hello Go语言的RPC规则：方法只能有两个可序列化的参数，其中第二个参数是指针类型，并且返回一个error类型，同时必须是公开的方法。
func (p *HelloService) Hello(request string, reply *string) error {
	*reply = "hello:" + request
	return nil
}

func RegisterHelloService(svc HelloServiceInterface) error {
	return rpc.RegisterName(HelloServiceName, svc)
}

/**
  服务器端
*/
func main() {

	//注册服务
	_ = RegisterHelloService(new(HelloService))
	//监听端口
	listen, err := net.Listen("tcp", ":8088")
	if err != nil {
		log.Fatal("Listen Exception：", err)
	}
	//监听连接
	accept, err := listen.Accept()
	if err != nil {
		log.Fatal("Accept Exception：", err)
	}
	//在该TCP链接上提供RPC服务
	rpc.ServeConn(accept)
}
